﻿using System;
using System.Collections.Generic;
using System.Html;
using System.Linq;
using jQueryApi;
using OcenyOpisowe.Client.Security;

namespace OcenyOpisowe.Client.Controls
{
	/// <summary>
	/// Kontrolka pozwalająca na wyświetlenie danych obecnie zalogowanego użytkownika.
	/// </summary>
	public class UserProfileControl : DataBoundControl
	{
		#region Prywatne zmienne klasy
		/// <summary>
		/// Identyfikator szablonu, w którym znajdują się informacje o wyglądzie kontrolki.
		/// </summary>
		private string _userProfileTemplateIdentifier;
		#endregion

		#region Metoda OnDataBinding
		/// <summary>
		/// Metoda zawierająca implementację bindowania danych do danej kontrolki.
		/// </summary>
		/// <remarks>
		/// Implementacja bindowania danych jest różna dla różnych kontrolek... więc cóż - metoda abstrakcyjna.
		/// </remarks>
		protected override void OnDataBinding()
		{
			DataSource.BeginDataLoading(OnDataLoaded);
		}
		#endregion

		#region Metoda OnDataLoaded
		/// <summary>
		/// Wywoływane po wczytaniu danych kontrolki.
		/// Binduję dane do szablonu a następnie dodaję kontrolkę do ekranu.
		/// </summary>
		/// <param name="data">Dane wczytane z serwera.</param>
		/// <param name="status">Status pobierania danych.</param>
		/// <param name="httpRequest">Obiekt rządania ajax'owego.</param>
		private void OnDataLoaded(object data, string status, jQueryXmlHttpRequest httpRequest)
		{
			object userDataObject = Type.GetField(data, "User");
			if(userDataObject != null)
			{
				User currentUser = new User();

				currentUser.Identifier = (int) Type.GetField(data, "Identifier");
				currentUser.Login = (string) Type.GetField(data, "Login");
				currentUser.FirstName = (string) Type.GetField(data, "FirstName");
				currentUser.Surname = (string) Type.GetField(data, "Surname");

				Application.Instance.CurrentUser = currentUser;
			}
			else
			{
				Application.Instance.CurrentUser = null;
			}

			Element nextElement = null;

			if (DomElement != null)
			{
				if (ParentDomElement != null)
					ParentDomElement.RemoveChild(DomElement);
				else
				{
					ParentDomElement = DomElement.ParentNode;
					nextElement = DomElement.NextSibling;
					DomElement.ParentNode.RemoveChild(DomElement);
				}
			}
			jQueryObject parsedMenuTemplate =
				(jQueryObject) Script.Literal("$(\"#\" + {0}).tmpl({1})", _userProfileTemplateIdentifier, data);

			if (parsedMenuTemplate == null || parsedMenuTemplate.Length == 0)
			{
				Application.Instance.Console.ReportError("Error ocured during user profile control initialization!");
				return;
			}
			DomElement = parsedMenuTemplate[0];
			if (nextElement != null)
				nextElement.InsertBefore(DomElement);
			else
				ParentDomElement.AppendChild(DomElement);
		}
		#endregion

		#region Metoda SetUserProfileTemplateIdentifier
		/// <summary>
		/// Metoda ustawiająca identyfikator szablonu wyglądu kontrolki.
		/// </summary>
		/// <param name="identifier">Identyfikator szablonu wyglądu kontrolki.</param>
		public void SetUserProfileTemplateIdentifier(string identifier)
		{
			_userProfileTemplateIdentifier = identifier;
		}
		#endregion
	}
}
